<?php
namespace app\logic;

ini_set('date.timezone','Asia/Shanghai');
error_reporting(E_ERROR);

require_once "../common/corelib/wxPay/lib/WxPay.Api.php";
require_once '../common/corelib/wxPay/lib/WxPay.Notify.php';
require_once '../common/corelib/wxPay/example/log.php';

use app\models\GoodsSku;
use app\models\Order;
use app\models\User;
use CLogFileHandler;
use WxPayNotify;
use WxPayOrderQuery;
use WxPayApi;
use Log;

//初始化日志
$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);

class PayNotifyCallBack extends WxPayNotify
{
	//查询订单
	public function Queryorder($transaction_id)
	{
		$input = new WxPayOrderQuery();
		$input->SetTransaction_id($transaction_id);
		$result = WxPayApi::orderQuery($input);
		Log::DEBUG("query:" . json_encode($result));
		if(array_key_exists("return_code", $result)
			&& array_key_exists("result_code", $result)
			&& $result["return_code"] == "SUCCESS"
			&& $result["result_code"] == "SUCCESS")
		{
			return true;
		}
		return false;
	}
	
	//重写回调处理函数
	public function NotifyProcess($data, &$msg)
	{
		Log::DEBUG("call back:" . json_encode($data));
		$notfiyOutput = array();
		
		if(!array_key_exists("transaction_id", $data)){
			$msg = "输入参数不正确";
			return false;
		}
		//查询订单，判断订单真实性
		if(!$this->Queryorder($data["transaction_id"])){
			$msg = "订单查询失败";
			return false;
		}

		if($order = GoodsSku::findOne(['order_no'=>$data['out_trade_no']])){
		    if($order->status==0){
                $db=\Yii::$app->db;
                $transaction = $db->beginTransaction();
                $order->status = 1;
                $order->pay_time = date('Y-m-d H:i:s');
                $order->save();
                if($order->type==0){
                    $play = Order::findOne(['play_id'=>$order->gp_id]);
                    if($play->type){
                        $user = User::findOne(['user_id'=>$order->user_id]);
                        if($user->current_num>0){
                            $user->current_num += $order->current_num;
                        }else{
                            $user->current_num = $order->current_num;
                        }
                        $user->save();
                    }
                }
                $transaction->commit();
            }
        }else{
            return false;
        }
		return true;
	}
}

